package main

import "fmt"

// Connect
// @Description: 连接
type Connect struct {
	id int
}

func NewConnect(id int) *Connect {
	return &Connect{id: id}
}

// ConnectPool
// @Description: 连接池
type ConnectPool struct {
	pool   map[int]*Connect
	nextID int
}

func NewDBPool(num int) *ConnectPool {
	var pool = map[int]*Connect{}
	for i := 1; i <= num; i++ {
		pool[i] = NewConnect(i)
	}
	return &ConnectPool{
		pool:   pool,
		nextID: num,
	}
}

// GetConnect 从连接池里面获取对象,如果不够-》创建新的
func (p *ConnectPool) GetConnect() *Connect {
	if len(p.pool) > 0 {
		for id, db := range p.pool {
			delete(p.pool, id)
			return db
		}
	}
	p.nextID++
	return NewConnect(p.nextID)
}

// ReleaseConnect 放回对象到连接池
func (p *ConnectPool) ReleaseConnect(db *Connect) {
	p.pool[db.id] = db
}

func (db Connect) Query(string2 string) {
	fmt.Printf("使用 %d 连接对象 进行查询操作 %s\n", db.id, string2)
}

// 它通过共享对象来减少内存使用和提高性能。享元模式的核心思想是将对象的共享部分（内部状态）与不可共享部分（外部状态）分离，从而减少重复对象的创建。
//
// 举个例子：共享单车
//
// 享元模式的核心思想： 享--共享
//
// 共享对象：
// 享元模式通过共享相同的内在状态（内部状态）来减少内存使用。
// 分离状态：
// 将对象的状态分为内部状态（可共享）和外部状态（不可共享）。
// 工厂管理：
// 使用工厂模式来管理和复用享元对象。
func main() {
	pool := NewDBPool(2)
	db1 := pool.GetConnect()
	db1.Query("select * from user")
	db2 := pool.GetConnect()
	db2.Query("select * from order")
	pool.ReleaseConnect(db2)
	pool.ReleaseConnect(db1)

	db4 := pool.GetConnect()
	db4.Query("select * from car")
	db5 := pool.GetConnect()
	db5.Query("select * from car")
	db6 := pool.GetConnect()
	db6.Query("select * from car")
}
